package com.king.juc.doublecheckedlocking;

/**
 * 单例模式下线程问题
 *
 * @author king
 * @date 2020/11/28 19:44
 */
public class Singleton {
    private Singleton(){}

    private static volatile Singleton INSTANCE = null;

    /**
     * 不加volatile会导致该变量没完全被synchronized管理, 发生指令重排问题
     */
//    private static Singleton INSTANCE = null;

    public static Singleton getInstance(){
        // 实例没创建, 才会进入内部synchronized代码块
        if(INSTANCE == null){
            synchronized (Singleton.class){
                // 也许有其他线程已经创建实例, 所以再判断一次
                if (INSTANCE == null){
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}
